package com.yhn.init.bizmq;

import com.rabbitmq.client.Channel;
import com.yhn.init.constant.MQConstant;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;

import java.io.IOException;

/**
 * 家具管理消费者
 *
 * @author yhn
 * @version 1.0
 * @description
 * @date 2024/3/15 10:12
 */
@Slf4j
public class FurnitureConsumer {
    /**
     * 指定程序监听的消息队列和确认机制
     *
     * @param message     确认接收的消息
     * @param channel     消息所在的通道，可以通过该通道与RabbitMQ交互，如手动确认拒绝消息
     * @param deliveryTag 消息的投递标签，用于唯一标识一条消息
     */

    //使用RabbitListener注解指定要监听的队列名称为demo_queue，设置消息的确认机制为手动
    @SneakyThrows
    @RabbitListener(queues = {MQConstant.QUEUE_NAME}, ackMode = "MANUAL")
    //@Header(AmqpHeaders.DELIVERY_TAG) 是一个方法参数注解，用于从消息头中获取投递标签
    private void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
        log.info("receiveMessage = {}", message);
        try {
            // 手动确认消息，向RabbitMq发送确认消息
            channel.basicAck(deliveryTag, false);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
